// // es5 构建类
// // 1.构造函数来构建对象 大写
// function Person(name,age) {
// 
//     this.name = name ;
//     this.age = age ;
// }
// Person.prototype.say = function() {
//     console.log('hello');
// }
// const p1 =new Person('冯浩浩',18)
// //***经过new Person后this指针指向p1，对象p1拥有了构造函数创建对象的属性,p1.__proto__指向Person.prototype，
// // 但是对象p1却没有拥有后者的方法。***
// console.log(p1.__proto__==Person.prototype,p1.name,p1.hasOwnProperty('name'),p1.hasOwnProperty('say'));
// p1.say()



//2.使用函数myNew代替new   (1和2产生的效果一样)
function Person(name,age,apperance) {

    this.name = name ;
    this.age = age ;
    this.apperance = apperance;
}
function myNew(fn,...args) {         //收敛为一个数组args
    //任何函数都有this和arguments，arguments是所有参数的集合是一个数组。
    console.log(args,typeof(args));
    console.log(arguments);
    let obj = Object.create(fn.prototype);
    //通过call方法来指定函数的指针指向，前缀为想要改变指针指向的函数，
    //第一个参数为想要指向的对象,后面的参数传给构造函数
    fn.call(obj,...args);   //展开数组args
    return obj;

}
let p3 = myNew(Person,'sun',18,'handsome')
Person.prototype.say = function (){
    console.log('hello');
}
console.log(p3,p3.hasOwnProperty('name'),p3.hasOwnProperty('say'));
p3.say()
